#include <stdio.h>

int main() {
    /*
        C语言支持三种程序运行结构: 顺序结构、选择结构、循环结构。
        ·顺序结构: 按照语句编写的顺序自上而下逐句执行。
        ·选择结构: 也叫分支结构，依据是否满足条件，有选择地执行相应功能。
        ·循环结构: 依据条件是否满足，重复多次执行某段代码。
        TIPS:结构与结构之间可以随意地进行嵌套。
    */
    printf("4.1选择结构一览:\n");

    //if...else if...else语句。从上往下判断，直到某个表达式的结果为逻辑真，则执行其内部的代码，并且结束整个选择结构。
    //if可以单独使用。if-else可以单独使用。——不举例了，太简单了。
    //TIPS:该语句如果需要执行的内部代码只有一行的情况下，甚至可以省略掉{}——但一般不推荐这样做，除非不太影响可读性且能保证不写错。
    int num;
    printf("请输入一个数:\n");
    scanf("%d", &num);
    getchar();
    if (num > 10)
        printf("条件成立处理该部分\n");
    else if (num > 5)
        printf("如果if条件不成立则再判断该条件，如果该条件成立处理该部分\n");
    else
        printf("其余条件都不成立处理该部分\n");


    //switch语句
    /*
        语法:
        switch(表达式)
        {
            case 常量表达式1: 语句1; break;
            ...
            case 常量表达式n-1: 语句n-1; break;
            default: 语句n; break;
        }
        TIPS: 表达式的值必须都为"整数"。
        执行逻辑:计算"表达式"的值，将结果与其后的常量表达式想匹配，若有匹配中的常量表达式，则执行其后的代码。若所有的case都不满足，则执行default的逻辑。
        TIPS: 1、case与default的位置怎么放都可以，甚至可以将default提到第1位。
        2、break是一个关键字，它的作用代表的是结束整个选择结构。如果省略不写，则会从首个匹配的case继续往下执行(无视掉表达式条件)直至找到break或者执行完所有的case以及default为止。
     */
    printf("请输入一个数字:\n");
    scanf("%d", &num);
    getchar();
    switch (num + 1) {
        //default可以提到首位。这并不影响所有的case均不匹配时会执行里面的代码这个逻辑。
        default:
            printf("没有该星期\n");
        case 1:
            printf("星期一\n");
            break;
            //演示一下为啥叫常量表达式
        case 1 + 1:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期日\n");
            break;
    }

    //while语句
    //语法:while(表达式) { 语句 }
    //执行逻辑:如果表达式的结构为逻辑真则执行循环体语句，直至此表达式变为逻辑假（也就是说如果表达式永远为逻辑真，则将会出现死循环）。
    int x = 3;
    while (x != 0) {
        printf("条件成立，执行循环体内代码\n");
        x--;
    }

    //do while语句
    //语法: do { 语句 } while(表达式);
    //执行逻辑:在判断while内的表达式前，直接执行一次循环体语句，后续跟while一样。
    do {
        printf("在判断表达式前先执行一次，后续跟while一样\n");
        x++;
    } while (x < 2);

    //for语句——C99扩展语法
    //语法: for(表达式1;表达式2;表达式3) { 语句 }
    //执行逻辑: 先处理表达式1，然后处理表达式2，若表达式2的值为逻辑真(非0)，则执行for语句代码块中的代码，
    //        执行完后处理表达式3，然后回归表达式2走同样的流程。而若表达式2的值为逻辑假，则结束循环。
    for (printf("处理表达式1\n"); x; --x) {
        printf("表达式2条件成立，执行内部代码\n");
    }
    //示例:求某个整数二进制表达形式中有多少个1
    int count = 0;
    printf("当前提供整数的值:%d\n", num);
    for (int i = 0; i < sizeof(num) * 8; ++i) {
        if ((num >> i) & 1) count++;
    }
    printf("当前提供整数的值二进制表达形式中有多少个1:%d\n", count);

    //流程控制结构的嵌套以及break语句以及continue语句的作用。
    for (int i = 0; i < 10; ++i) {
        int y = 0;
        if (i == 2) {
            //continue语句用于循环结构内，作用是结束本次循环，直接进入下次循环。
            printf("结束本次循环，进入下一次循环，目前是第%d次循环\n", i);
            continue;
        }
        if (i == 4) {
            //break语句用于循环结构和switch语句内。作用是终止结构判断，直接跳出到该循环结构和switch之外。
            printf("终止本次循环，直接跳出，目前是第%d次循环\n", i);
            break;
        }
        //一般将一个循环内的循环称为"内循环"，外面那个称为"外循环"。
        while (y < 4) {
            if (y == 0) {
                printf("if条件成立，执行代码\n");
            } else if (y == 1) {
                printf("else if条件成立，执行代码\n");
            } else {
                if (y == 3) {
                    break;
                }
                printf("else条件成立，执行代码\n");
            }
            y++;
        }
        printf("即将进入外循环的下一次循环，目前是第%d次循环\n", i);
    }

    return 0;
}